package aip2011.service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.slim3.controller.upload.FileItem;
import org.slim3.datastore.Datastore;
import org.slim3.util.BeanUtil;
import org.slim3.util.ByteUtil;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Transaction;

import aip2011.meta.ImmagineRifugioFragmentMeta;
import aip2011.meta.ImmagineRifugioMeta;
import aip2011.meta.RifugioMeta;

import aip2011.model.ImmagineRifugio;
import aip2011.model.ImmagineRifugioFragment;
import aip2011.model.Rifugio;

public class RifugioService {
    
    private RifugioMeta r=new RifugioMeta();
    private ImmagineRifugioMeta i = ImmagineRifugioMeta.get();
    private ImmagineRifugioFragmentMeta f = ImmagineRifugioFragmentMeta.get();
    private static final int FRAGMENT_SIZE = 900000;
    ImmagineRifugio data = new ImmagineRifugio();
    
    public Rifugio insert(Map<String, Object> input,FileItem f) {
        Rifugio rifugio=new Rifugio();
        BeanUtil.copy(input, rifugio);
        Transaction tx = Datastore.beginTransaction();
        Datastore.put(rifugio);
        upload(f,rifugio.getKey());
        rifugio.setIntroImage(data.getKey());
        rifugio.setImageVersion(data.getVersion());
        Datastore.put(rifugio);
        tx.commit();
       
        return rifugio;
        }
    
    
    public ImmagineRifugio upload(FileItem formFile, Key keyRifugio) {
        if (formFile == null) {
          return null;
        }
        List<Object> models = new ArrayList<Object>();     
        models.add(data);
        data.setKey(Datastore.allocateId(i));
        data.setNome(formFile.getShortFileName());  
        data.setLength(formFile.getData().length);
        data.setKey_Rifugio(keyRifugio);
        byte[] bytes = formFile.getData();
        byte[][] bytesArray = ByteUtil.split(bytes, FRAGMENT_SIZE);
        Iterator<Key> keys =
            Datastore
                .allocateIds(data.getKey(), f, bytesArray.length)
                .iterator();
        for (int i = 0; i < bytesArray.length; i++) {
            byte[] fragmentData = bytesArray[i];
            ImmagineRifugioFragment fragment = new ImmagineRifugioFragment();
            models.add(fragment);
            fragment.setKey(keys.next());
            fragment.setBytes(fragmentData);
            fragment.setIndex(i);
            fragment.getUploadDataRef().setModel(data);
        }
        Transaction tx = Datastore.beginTransaction();
        for (Object model : models) {
            Datastore.put(tx, model);
        }
        tx.commit();
        return data;
    }

    public List<Rifugio> getRifugiList() {
     return Datastore.query(r).sort(r.nome.asc).asList();
    }
    
    public List<Rifugio> getRifugiConsigliatiList() {
        return Datastore.query(r).filter(r.consigliato.equal(true)).asList(); 
       }

    public Rifugio getRifugio(Key k) { 
        return Datastore.get(r,k);
      }
    public List<Rifugio> getRifugioPerLocalita(String loc) { 
        return Datastore.query(r).filter(r.localita.equal(loc)).asList();
      }
    
    public List<Rifugio> getRifugioPerZona(String zona) { 
        return Datastore.query(r).filter(r.zona.equal(zona)).asList();
      }

    public List<ImmagineRifugio> getListaImmagini(Key key)
    {
        List<ImmagineRifugio> immagini = (List<ImmagineRifugio>)Datastore.query(i).filter(i.key_Rifugio.equal(key)).asList();
        return immagini;
    }
  
    
}